package com.wengu.rabbitmq.simple;
import com.rabbitmq.client.*;
import com.wengu.rabbitmq.util.ConnectionUtil;
import java.io.IOException;

//simple消息模型的消费者
//了解
public class Recv {
    public static void main(String[] args) throws Exception {
        //1、获取连接
        Connection connection = ConnectionUtil.getConnection();
        //2、创建通道
        Channel channel = connection.createChannel();
        //3、通过通道定义要连接的队列
        channel.queueDeclare(Send.QUEUE_NAME , false , false , false , null);
        //4、监听队列
        //参数1：队列名称，参数2：消息接收到之后是否要自动确认，参数3：监听队列消息的回调对象(消息消费者对象)
        Consumer callback = new DefaultConsumer(channel){
            //参数：Envelope信封(消息的描述信息)，body获取到的消息内容
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //模拟异常
                int i = 1/0;
                //5、如果队列中有数据则消费使用的回调方法
                System.out.println("[ RECV ] 接收到消息：" + new String(body));
                System.out.println("当前接收消息的唯一标志："+ envelope.getDeliveryTag());
                //autoAck配置的为true，当前handleDelivery方法只要被调用，channel会自动向mq发送一个消息消费确认，mq服务端会将该消息删除
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        //阻塞：循环监听指定的消息队列
        channel.basicConsume(Send.QUEUE_NAME,false , callback);
    }
}